package com.thinkgem.jeesite.modules.act.service;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import javax.xml.stream.XMLStreamException;

import org.activiti.engine.runtime.ProcessInstance;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import com.thinkgem.jeesite.common.persistence.Page;

/**
 * TODO:工作流任务接口
 *
 * @author 作者：lgx
 * @date 创建时间：2016年3月23日
 * @version V1.0
 */
public abstract interface ActProcessServiceInterface {

	/**
	 * 流程定义列表
	 */
	public Page<Object[]> processList(Page<Object[]> page, String category);

	/**
	 * 正在运行的流程定义列表
	 */
	public Page<ProcessInstance> runningList(Page<ProcessInstance> page,
			String procInsId, String procDefKey);

	/**
	 * 读取资源，通过部署ID
	 * 
	 * @param processDefinitionId
	 *            流程定义ID
	 * @param processInstanceId
	 *            流程实例ID
	 * @param resourceType
	 *            资源类型(xml|image)
	 */
	public InputStream resourceRead(String procDefId, String proInsId,
			String resType) throws Exception;

	/**
	 * 部署流程 - 保存
	 * 
	 * @param file
	 * @return
	 */
	public String deploy(String exportDir, String category, MultipartFile file);

	/**
	 * 设置流程分类
	 */
	public void updateCategory(String procDefId, String category);

	/**
	 * 挂起、激活流程实例
	 */
	public String updateState(String state, String procDefId);

	/**
	 * 将部署的流程转换为模型
	 * 
	 * @param procDefId
	 * @throws UnsupportedEncodingException
	 * @throws XMLStreamException
	 */
	public org.activiti.engine.repository.Model convertToModel(String procDefId)
			throws UnsupportedEncodingException, XMLStreamException;

	/**
	 * 导出图片文件到硬盘
	 */
	public List<String> exportDiagrams(String exportDir) throws IOException;

	/**
	 * 删除部署的流程，级联删除流程实例
	 * 
	 * @param deploymentId
	 *            流程部署ID
	 */
	public void deleteDeployment(String deploymentId);

	/**
	 * 删除部署的流程实例
	 * 
	 * @param procInsId
	 *            流程实例ID
	 * @param deleteReason
	 *            删除原因，可为空
	 */
	public void deleteProcIns(String procInsId, String deleteReason);

	/**
	 * 根据流程实例id获取流程实例对象
	 * 
	 * @param procInsId
	 * @return
	 */
	@Transactional(readOnly = false)
	public ProcessInstance getProcIns(String procInsId);

	/**
	 * 启动流程
	 * 
	 * @param procDefKey
	 *            流程定义KEY
	 * @param businessTable
	 *            业务表表名
	 * @param businessId
	 *            业务表编号
	 * @return 流程实例ID
	 */
	@Transactional(readOnly = false)
	public String startProcess(String procDefKey, String businessTable,
			String businessId);

	/**
	 * 启动流程
	 * 
	 * @param procDefKey
	 *            流程定义KEY
	 * @param businessTable
	 *            业务表表名
	 * @param businessId
	 *            业务表编号
	 * @param title
	 *            流程标题，显示在待办任务标题
	 * @return 流程实例ID
	 */
	public String startProcess(String procDefKey, String businessTable,
			String businessId, String title);

}
